You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

la_constants.f90 5.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. ! Standard constants for
  45. integer, parameter :: sp = kind(1.e0)
  46. real(sp), parameter :: szero = 0.0_sp
  47. real(sp), parameter :: shalf = 0.5_sp
  48. real(sp), parameter :: sone = 1.0_sp
  49. real(sp), parameter :: stwo = 2.0_sp
  50. real(sp), parameter :: sthree = 3.0_sp
  51. real(sp), parameter :: sfour = 4.0_sp
  52. real(sp), parameter :: seight = 8.0_sp
  53. real(sp), parameter :: sten = 10.0_sp
  54. complex(sp), parameter :: czero = ( 0.0_sp, 0.0_sp )
  55. complex(sp), parameter :: chalf = ( 0.5_sp, 0.0_sp )
  56. complex(sp), parameter :: cone = ( 1.0_sp, 0.0_sp )
  57. character*1, parameter :: sprefix = 'S'
  58. character*1, parameter :: cprefix = 'C'
  59. ! Scaling constants
  60. real(sp), parameter :: sulp = epsilon(0._sp)
  61. real(sp), parameter :: seps = sulp * 0.5_sp
  62. real(sp), parameter :: ssafmin = real(radix(0._sp),sp)**max( &
  63. minexponent(0._sp)-1, &
  64. 1-maxexponent(0._sp) &
  65. )
  66. real(sp), parameter :: ssafmax = sone / ssafmin
  67. real(sp), parameter :: ssmlnum = ssafmin / sulp
  68. real(sp), parameter :: sbignum = ssafmax * sulp
  69. real(sp), parameter :: srtmin = sqrt(ssmlnum)
  70. real(sp), parameter :: srtmax = sqrt(sbignum)
  71. ! Blue's scaling constants
  72. real(sp), parameter :: stsml = real(radix(0._sp), sp)**ceiling( &
  73. (minexponent(0._sp) - 1) * 0.5_sp)
  74. real(sp), parameter :: stbig = real(radix(0._sp), sp)**floor( &
  75. (maxexponent(0._sp) - digits(0._sp) + 1) * 0.5_sp)
  76. ! ssml >= 1/s, where s was defined in https://doi.org/10.1145/355769.355771
  77. ! The correction was added in https://doi.org/10.1145/3061665 to scale denormalized numbers correctly
  78. real(sp), parameter :: sssml = real(radix(0._sp), sp)**( - floor( &
  79. (minexponent(0._sp) - digits(0._sp)) * 0.5_sp))
  80. ! sbig = 1/S, where S was defined in https://doi.org/10.1145/355769.355771
  81. real(sp), parameter :: ssbig = real(radix(0._sp), sp)**( - ceiling( &
  82. (maxexponent(0._sp) + digits(0._sp) - 1) * 0.5_sp))
  83. ! Standard constants for
  84. integer, parameter :: dp = kind(1.d0)
  85. real(dp), parameter :: dzero = 0.0_dp
  86. real(dp), parameter :: dhalf = 0.5_dp
  87. real(dp), parameter :: done = 1.0_dp
  88. real(dp), parameter :: dtwo = 2.0_dp
  89. real(dp), parameter :: dthree = 3.0_dp
  90. real(dp), parameter :: dfour = 4.0_dp
  91. real(dp), parameter :: deight = 8.0_dp
  92. real(dp), parameter :: dten = 10.0_dp
  93. complex(dp), parameter :: zzero = ( 0.0_dp, 0.0_dp )
  94. complex(dp), parameter :: zhalf = ( 0.5_dp, 0.0_dp )
  95. complex(dp), parameter :: zone = ( 1.0_dp, 0.0_dp )
  96. character*1, parameter :: dprefix = 'D'
  97. character*1, parameter :: zprefix = 'Z'
  98. ! Scaling constants
  99. real(dp), parameter :: dulp = epsilon(0._dp)
  100. real(dp), parameter :: deps = dulp * 0.5_dp
  101. real(dp), parameter :: dsafmin = real(radix(0._dp),dp)**max( &
  102. minexponent(0._dp)-1, &
  103. 1-maxexponent(0._dp) &
  104. )
  105. real(dp), parameter :: dsafmax = done / dsafmin
  106. real(dp), parameter :: dsmlnum = dsafmin / dulp
  107. real(dp), parameter :: dbignum = dsafmax * dulp
  108. real(dp), parameter :: drtmin = sqrt(dsmlnum)
  109. real(dp), parameter :: drtmax = sqrt(dbignum)
  110. ! Blue's scaling constants
  111. real(dp), parameter :: dtsml = real(radix(0._dp), dp)**ceiling( &
  112. (minexponent(0._dp) - 1) * 0.5_dp)
  113. real(dp), parameter :: dtbig = real(radix(0._dp), dp)**floor( &
  114. (maxexponent(0._dp) - digits(0._dp) + 1) * 0.5_dp)
  115. ! ssml >= 1/s, where s was defined in https://doi.org/10.1145/355769.355771
  116. ! The correction was added in https://doi.org/10.1145/3061665 to scale denormalized numbers correctly
  117. real(dp), parameter :: dssml = real(radix(0._dp), dp)**( - floor( &
  118. (minexponent(0._dp) - digits(0._dp)) * 0.5_dp))
  119. ! sbig = 1/S, where S was defined in https://doi.org/10.1145/355769.355771
  120. real(dp), parameter :: dsbig = real(radix(0._dp), dp)**( - ceiling( &
  121. (maxexponent(0._dp) + digits(0._dp) - 1) * 0.5_dp))
  122. end module LA_CONSTANTS