File:  [local] / rpl / lapack / lapack / la_constants.f90
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Mon Aug 7 09:04:57 2023 UTC (8 months, 3 weeks ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, HEAD
Ajour de deux modules.

    1: !> \brief \b LA_CONSTANTS is a module for the scaling constants for the compiled Fortran single and double precisions
    2: !
    3: !  =========== DOCUMENTATION ===========
    4: !
    5: ! Online html documentation available at
    6: !            http://www.netlib.org/lapack/explore-html/
    7: !
    8: !  Authors:
    9: !  ========
   10: !
   11: !> \author Edward Anderson, Lockheed Martin
   12: !
   13: !> \date May 2016
   14: !
   15: !> \ingroup OTHERauxiliary
   16: !
   17: !> \par Contributors:
   18: !  ==================
   19: !>
   20: !> Weslley Pereira, University of Colorado Denver, USA
   21: !> Nick Papior, Technical University of Denmark, DK
   22: !
   23: !> \par Further Details:
   24: !  =====================
   25: !>
   26: !> \verbatim
   27: !>
   28: !>  Anderson E. (2017)
   29: !>  Algorithm 978: Safe Scaling in the Level 1 BLAS
   30: !>  ACM Trans Math Softw 44:1--28
   31: !>  https://doi.org/10.1145/3061665
   32: !>
   33: !>  Blue, James L. (1978)
   34: !>  A Portable Fortran Program to Find the Euclidean Norm of a Vector
   35: !>  ACM Trans Math Softw 4:15--23
   36: !>  https://doi.org/10.1145/355769.355771
   37: !>
   38: !> \endverbatim
   39: !
   40: module LA_CONSTANTS
   41: !  -- LAPACK auxiliary module --
   42: !  -- LAPACK is a software package provided by Univ. of Tennessee,    --
   43: !  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
   44: 
   45: !  Standard constants for 
   46:    integer, parameter :: sp = kind(1.e0)
   47: 
   48:    real(sp), parameter :: szero = 0.0_sp
   49:    real(sp), parameter :: shalf = 0.5_sp
   50:    real(sp), parameter :: sone = 1.0_sp
   51:    real(sp), parameter :: stwo = 2.0_sp
   52:    real(sp), parameter :: sthree = 3.0_sp
   53:    real(sp), parameter :: sfour = 4.0_sp
   54:    real(sp), parameter :: seight = 8.0_sp
   55:    real(sp), parameter :: sten = 10.0_sp
   56:    complex(sp), parameter :: czero = ( 0.0_sp, 0.0_sp )
   57:    complex(sp), parameter :: chalf = ( 0.5_sp, 0.0_sp )
   58:    complex(sp), parameter :: cone = ( 1.0_sp, 0.0_sp )
   59:    character*1, parameter :: sprefix = 'S'
   60:    character*1, parameter :: cprefix = 'C'
   61: 
   62: !  Scaling constants
   63:    real(sp), parameter :: sulp = epsilon(0._sp)
   64:    real(sp), parameter :: seps = sulp * 0.5_sp
   65:    real(sp), parameter :: ssafmin = real(radix(0._sp),sp)**max( &
   66:       minexponent(0._sp)-1, &
   67:       1-maxexponent(0._sp) &
   68:    )
   69:    real(sp), parameter :: ssafmax = sone / ssafmin
   70:    real(sp), parameter :: ssmlnum = ssafmin / sulp
   71:    real(sp), parameter :: sbignum = ssafmax * sulp
   72:    real(sp), parameter :: srtmin = sqrt(ssmlnum)
   73:    real(sp), parameter :: srtmax = sqrt(sbignum)
   74: 
   75: !  Blue's scaling constants
   76:    real(sp), parameter :: stsml = real(radix(0._sp), sp)**ceiling( &
   77:        (minexponent(0._sp) - 1) * 0.5_sp)
   78:    real(sp), parameter :: stbig = real(radix(0._sp), sp)**floor( &
   79:        (maxexponent(0._sp) - digits(0._sp) + 1) * 0.5_sp)
   80: !  ssml >= 1/s, where s was defined in https://doi.org/10.1145/355769.355771
   81: !  The correction was added in https://doi.org/10.1145/3061665 to scale denormalized numbers correctly 
   82:    real(sp), parameter :: sssml = real(radix(0._sp), sp)**( - floor( &
   83:        (minexponent(0._sp) - digits(0._sp)) * 0.5_sp))
   84: !  sbig = 1/S, where S was defined in https://doi.org/10.1145/355769.355771
   85:    real(sp), parameter :: ssbig = real(radix(0._sp), sp)**( - ceiling( &
   86:        (maxexponent(0._sp) + digits(0._sp) - 1) * 0.5_sp))
   87: 
   88: !  Standard constants for 
   89:    integer, parameter :: dp = kind(1.d0)
   90: 
   91:    real(dp), parameter :: dzero = 0.0_dp
   92:    real(dp), parameter :: dhalf = 0.5_dp
   93:    real(dp), parameter :: done = 1.0_dp
   94:    real(dp), parameter :: dtwo = 2.0_dp
   95:    real(dp), parameter :: dthree = 3.0_dp
   96:    real(dp), parameter :: dfour = 4.0_dp
   97:    real(dp), parameter :: deight = 8.0_dp
   98:    real(dp), parameter :: dten = 10.0_dp
   99:    complex(dp), parameter :: zzero = ( 0.0_dp, 0.0_dp )
  100:    complex(dp), parameter :: zhalf = ( 0.5_dp, 0.0_dp )
  101:    complex(dp), parameter :: zone = ( 1.0_dp, 0.0_dp )
  102:    character*1, parameter :: dprefix = 'D'
  103:    character*1, parameter :: zprefix = 'Z'
  104: 
  105: !  Scaling constants
  106:    real(dp), parameter :: dulp = epsilon(0._dp)
  107:    real(dp), parameter :: deps = dulp * 0.5_dp
  108:    real(dp), parameter :: dsafmin = real(radix(0._dp),dp)**max( &
  109:       minexponent(0._dp)-1, &
  110:       1-maxexponent(0._dp) &
  111:    )
  112:    real(dp), parameter :: dsafmax = done / dsafmin
  113:    real(dp), parameter :: dsmlnum = dsafmin / dulp
  114:    real(dp), parameter :: dbignum = dsafmax * dulp
  115:    real(dp), parameter :: drtmin = sqrt(dsmlnum)
  116:    real(dp), parameter :: drtmax = sqrt(dbignum)
  117: 
  118: !  Blue's scaling constants
  119:    real(dp), parameter :: dtsml = real(radix(0._dp), dp)**ceiling( &
  120:        (minexponent(0._dp) - 1) * 0.5_dp)
  121:    real(dp), parameter :: dtbig = real(radix(0._dp), dp)**floor( &
  122:        (maxexponent(0._dp) - digits(0._dp) + 1) * 0.5_dp)
  123: !  ssml >= 1/s, where s was defined in https://doi.org/10.1145/355769.355771
  124: !  The correction was added in https://doi.org/10.1145/3061665 to scale denormalized numbers correctly 
  125:    real(dp), parameter :: dssml = real(radix(0._dp), dp)**( - floor( &
  126:        (minexponent(0._dp) - digits(0._dp)) * 0.5_dp))
  127: !  sbig = 1/S, where S was defined in https://doi.org/10.1145/355769.355771
  128:    real(dp), parameter :: dsbig = real(radix(0._dp), dp)**( - ceiling( &
  129:        (maxexponent(0._dp) + digits(0._dp) - 1) * 0.5_dp))
  130: 
  131: end module LA_CONSTANTS

CVSweb interface <joel.bertrand@systella.fr>