Skip to content

Commit ebb81cb

Browse files
authored
Merge pull request #501 from weslleyspereira/try-module-for-scaling-constants
Try module for scaling constants
2 parents acbf970 + 5b73654 commit ebb81cb

File tree

4 files changed

+152
-3
lines changed

4 files changed

+152
-3
lines changed

DOCS/Doxyfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,7 @@ INPUT_ENCODING = UTF-8
886886

887887
FILE_PATTERNS = *.c \
888888
*.f \
889+
*.f90 \
889890
*.h
890891

891892
# The RECURSIVE tag can be used to specify whether or not subdirectories should

SRC/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ set(ALLAUX ilaenv.f ilaenv2stage.f ieeeck.f lsamen.f iparmq.f iparam2stage.F
4141
../INSTALL/slamch.f)
4242

4343
set(SCLAUX
44+
la_constants.f90
4445
sbdsdc.f
4546
sbdsqr.f sdisna.f slabad.f slacpy.f sladiv.f slae2.f slaebz.f
4647
slaed0.f slaed1.f slaed2.f slaed3.f slaed4.f slaed5.f slaed6.f
@@ -59,6 +60,7 @@ set(SCLAUX
5960
${SECOND_SRC})
6061

6162
set(DZLAUX
63+
la_constants.f90
6264
dbdsdc.f
6365
dbdsqr.f ddisna.f dlabad.f dlacpy.f dladiv.f dlae2.f dlaebz.f
6466
dlaed0.f dlaed1.f dlaed2.f dlaed3.f dlaed4.f dlaed5.f dlaed6.f

SRC/Makefile

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,27 @@
5757
TOPSRCDIR = ..
5858
include $(TOPSRCDIR)/make.inc
5959

60-
.SUFFIXES: .F .o
61-
.F.o:
60+
ALLMOD = la_constants.mod
61+
62+
.SUFFIXES: .f .F .f90 .F90 .o .mod
63+
%.o: %.f $(ALLMOD)
64+
$(FC) $(FFLAGS) -c -o $@ $<
65+
%.o: %.F $(ALLMOD)
66+
$(FC) $(FFLAGS) -c -o $@ $<
67+
%.o: %.f90 $(ALLMOD)
6268
$(FC) $(FFLAGS) -c -o $@ $<
69+
%.o: %.F90 $(ALLMOD)
70+
$(FC) $(FFLAGS) -c -o $@ $<
71+
.o.mod:
72+
@true
6373

6474
ALLAUX = ilaenv.o ilaenv2stage.o ieeeck.o lsamen.o xerbla.o xerbla_array.o \
6575
iparmq.o iparam2stage.o \
6676
ilaprec.o ilatrans.o ilauplo.o iladiag.o chla_transtype.o \
6777
../INSTALL/ilaver.o ../INSTALL/lsame.o ../INSTALL/slamch.o
6878

6979
SCLAUX = \
80+
la_constants.o \
7081
sbdsdc.o \
7182
sbdsqr.o sdisna.o slabad.o slacpy.o sladiv.o slae2.o slaebz.o \
7283
slaed0.o slaed1.o slaed2.o slaed3.o slaed4.o slaed5.o slaed6.o \
@@ -85,6 +96,7 @@ SCLAUX = \
8596
../INSTALL/second_$(TIMER).o
8697

8798
DZLAUX = \
99+
la_constants.o \
88100
dbdsdc.o \
89101
dbdsqr.o ddisna.o dlabad.o dlacpy.o dladiv.o dlae2.o dlaebz.o \
90102
dlaed0.o dlaed1.o dlaed2.o dlaed3.o dlaed4.o dlaed5.o dlaed6.o \
@@ -608,7 +620,7 @@ endif
608620
.PHONY: clean cleanobj cleanlib
609621
clean: cleanobj cleanlib
610622
cleanobj:
611-
rm -f *.o DEPRECATED/*.o
623+
rm -f *.o *.mod DEPRECATED/*.o DEPRECATED/*.mod
612624
cleanlib:
613625
rm -f $(LAPACKLIB)
614626

@@ -618,3 +630,7 @@ sla_wwaddw.o: sla_wwaddw.f ; $(FC) $(FFLAGS_NOOPT) -c -o $@ $<
618630
dla_wwaddw.o: dla_wwaddw.f ; $(FC) $(FFLAGS_NOOPT) -c -o $@ $<
619631
cla_wwaddw.o: cla_wwaddw.f ; $(FC) $(FFLAGS_NOOPT) -c -o $@ $<
620632
zla_wwaddw.o: zla_wwaddw.f ; $(FC) $(FFLAGS_NOOPT) -c -o $@ $<
633+
634+
# Modules
635+
la_constants.o: la_constants.f90
636+
$(FC) $(FFLAGS) -c -o $@ $<

SRC/la_constants.f90

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
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 (version 3.10.0) --
42+
! -- LAPACK is a software package provided by Univ. of Tennessee, --
43+
! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
44+
! February 2021
45+
46+
! Standard constants for
47+
integer, parameter :: sp = kind(1.e0)
48+
49+
real(sp), parameter :: szero = 0.0_sp
50+
real(sp), parameter :: shalf = 0.5_sp
51+
real(sp), parameter :: sone = 1.0_sp
52+
real(sp), parameter :: stwo = 2.0_sp
53+
real(sp), parameter :: sthree = 3.0_sp
54+
real(sp), parameter :: sfour = 4.0_sp
55+
real(sp), parameter :: seight = 8.0_sp
56+
real(sp), parameter :: sten = 10.0_sp
57+
complex(sp), parameter :: czero = ( 0.0_sp, 0.0_sp )
58+
complex(sp), parameter :: chalf = ( 0.5_sp, 0.0_sp )
59+
complex(sp), parameter :: cone = ( 1.0_sp, 0.0_sp )
60+
character*1, parameter :: sprefix = 'S'
61+
character*1, parameter :: cprefix = 'C'
62+
63+
! Scaling constants
64+
real(sp), parameter :: sulp = epsilon(0._sp)
65+
real(sp), parameter :: seps = sulp * 0.5_sp
66+
real(sp), parameter :: ssafmin = real(radix(0._sp),sp)**max( &
67+
minexponent(0._sp)-1, &
68+
1-maxexponent(0._sp) &
69+
)
70+
real(sp), parameter :: ssafmax = sone / ssafmin
71+
real(sp), parameter :: ssmlnum = ssafmin / sulp
72+
real(sp), parameter :: sbignum = ssafmax * sulp
73+
real(sp), parameter :: srtmin = sqrt(ssmlnum)
74+
real(sp), parameter :: srtmax = sqrt(sbignum)
75+
76+
! Blue's scaling constants
77+
real(sp), parameter :: stsml = real(radix(0._sp), sp)**ceiling( &
78+
(minexponent(0._sp) - 1) * 0.5_sp)
79+
real(sp), parameter :: stbig = real(radix(0._sp), sp)**floor( &
80+
(maxexponent(0._sp) - digits(0._sp) + 1) * 0.5_sp)
81+
! ssml = 1/s, where s was defined in https://doi.org/10.1145/355769.355771
82+
real(sp), parameter :: sssml = real(radix(0._sp), sp)**( - floor( &
83+
(minexponent(0._sp) - 1) * 0.5_sp))
84+
! ssml = 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+
real(dp), parameter :: dssml = real(radix(0._dp), dp)**( - floor( &
125+
(minexponent(0._dp) - 1) * 0.5_dp))
126+
! ssml = 1/S, where S was defined in https://doi.org/10.1145/355769.355771
127+
real(dp), parameter :: dsbig = real(radix(0._dp), dp)**( - ceiling( &
128+
(maxexponent(0._dp) - digits(0._dp) + 1) * 0.5_dp))
129+
130+
end module LA_CONSTANTS

0 commit comments

Comments
 (0)