Skip to content

Commit cda8a83

Browse files
committed
Add level-3 BLAS triangular Sylvester equation solver
Force compatibility with [ds]trsyl. Use two floating-point scaling factors (rather than integer scaling factors). This does not eliminate the problem that scalings can be flushed, making any result useless. That problem could be eliminated by replacing the floating-point scale factor with an integer scale factor.
1 parent 801ac2f commit cda8a83

File tree

7 files changed

+2699
-10
lines changed

7 files changed

+2699
-10
lines changed

SRC/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ set(SLASRC
105105
slaqgb.f slaqge.f slaqp2.f slaqps.f slaqsb.f slaqsp.f slaqsy.f
106106
slaqr0.f slaqr1.f slaqr2.f slaqr3.f slaqr4.f slaqr5.f
107107
slaqtr.f slar1v.f slar2v.f ilaslr.f ilaslc.f
108-
slarf.f slarfb.f slarfb_gett.f slarfg.f slarfgp.f slarft.f slarfx.f slarfy.f slargv.f
109-
slarrv.f slartv.f
108+
slarf.f slarfb.f slarfb_gett.f slarfg.f slarfgp.f slarft.f slarfx.f slarfy.f
109+
slargv.f slarmm.f slarrv.f slartv.f
110110
slarz.f slarzb.f slarzt.f slasy2.f
111111
slasyf.f slasyf_rook.f slasyf_rk.f slasyf_aa.f
112112
slatbs.f slatdf.f slatps.f slatrd.f slatrs.f slatrz.f
@@ -141,7 +141,7 @@ set(SLASRC
141141
stgsja.f stgsna.f stgsy2.f stgsyl.f stpcon.f stprfs.f stptri.f
142142
stptrs.f
143143
strcon.f strevc.f strevc3.f strexc.f strrfs.f strsen.f strsna.f strsyl.f
144-
strti2.f strtri.f strtrs.f stzrzf.f sstemr.f
144+
strsyl3.f strti2.f strtri.f strtrs.f stzrzf.f sstemr.f
145145
slansf.f spftrf.f spftri.f spftrs.f ssfrk.f stfsm.f stftri.f stfttp.f
146146
stfttr.f stpttf.f stpttr.f strttf.f strttp.f
147147
sgejsv.f sgesvj.f sgsvj0.f sgsvj1.f
@@ -306,7 +306,7 @@ set(DLASRC
306306
dlaqr0.f dlaqr1.f dlaqr2.f dlaqr3.f dlaqr4.f dlaqr5.f
307307
dlaqtr.f dlar1v.f dlar2v.f iladlr.f iladlc.f
308308
dlarf.f dlarfb.f dlarfb_gett.f dlarfg.f dlarfgp.f dlarft.f dlarfx.f dlarfy.f
309-
dlargv.f dlarrv.f dlartv.f
309+
dlargv.f dlarmm.f dlarrv.f dlartv.f
310310
dlarz.f dlarzb.f dlarzt.f dlaswp.f dlasy2.f
311311
dlasyf.f dlasyf_rook.f dlasyf_rk.f dlasyf_aa.f
312312
dlatbs.f dlatdf.f dlatps.f dlatrd.f dlatrs.f dlatrz.f dlauu2.f
@@ -342,7 +342,7 @@ set(DLASRC
342342
dtgsja.f dtgsna.f dtgsy2.f dtgsyl.f dtpcon.f dtprfs.f dtptri.f
343343
dtptrs.f
344344
dtrcon.f dtrevc.f dtrevc3.f dtrexc.f dtrrfs.f dtrsen.f dtrsna.f dtrsyl.f
345-
dtrti2.f dtrtri.f dtrtrs.f dtzrzf.f dstemr.f
345+
dtrsyl3.f dtrti2.f dtrtri.f dtrtrs.f dtzrzf.f dstemr.f
346346
dsgesv.f dsposv.f dlag2s.f slag2d.f dlat2s.f
347347
dlansf.f dpftrf.f dpftri.f dpftrs.f dsfrk.f dtfsm.f dtftri.f dtfttp.f
348348
dtfttr.f dtpttf.f dtpttr.f dtrttf.f dtrttp.f

SRC/Makefile

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ SLASRC = \
137137
slaqgb.o slaqge.o slaqp2.o slaqps.o slaqsb.o slaqsp.o slaqsy.o \
138138
slaqr0.o slaqr1.o slaqr2.o slaqr3.o slaqr4.o slaqr5.o \
139139
slaqtr.o slar1v.o slar2v.o ilaslr.o ilaslc.o \
140-
slarf.o slarfb.o slarfb_gett.o slarfg.o slarfgp.o slarft.o slarfx.o slarfy.o slargv.o \
141-
slarrv.o slartv.o \
140+
slarf.o slarfb.o slarfb_gett.o slarfg.o slarfgp.o slarft.o slarfx.o slarfy.o \
141+
slargv.o slarmm.o slarrv.o slartv.o \
142142
slarz.o slarzb.o slarzt.o slaswp.o slasy2.o slasyf.o slasyf_rook.o \
143143
slasyf_rk.o \
144144
slatbs.o slatdf.o slatps.o slatrd.o slatrs.o slatrz.o \
@@ -174,7 +174,7 @@ SLASRC = \
174174
stgsja.o stgsna.o stgsy2.o stgsyl.o stpcon.o stprfs.o stptri.o \
175175
stptrs.o \
176176
strcon.o strevc.o strevc3.o strexc.o strrfs.o strsen.o strsna.o strsyl.o \
177-
strti2.o strtri.o strtrs.o stzrzf.o sstemr.o \
177+
strsyl3.o strti2.o strtri.o strtrs.o stzrzf.o sstemr.o \
178178
slansf.o spftrf.o spftri.o spftrs.o ssfrk.o stfsm.o stftri.o stfttp.o \
179179
stfttr.o stpttf.o stpttr.o strttf.o strttp.o \
180180
sgejsv.o sgesvj.o sgsvj0.o sgsvj1.o \
@@ -340,7 +340,7 @@ DLASRC = \
340340
dlaqr0.o dlaqr1.o dlaqr2.o dlaqr3.o dlaqr4.o dlaqr5.o \
341341
dlaqtr.o dlar1v.o dlar2v.o iladlr.o iladlc.o \
342342
dlarf.o dlarfb.o dlarfb_gett.o dlarfg.o dlarfgp.o dlarft.o dlarfx.o dlarfy.o \
343-
dlargv.o dlarrv.o dlartv.o \
343+
dlargv.o dlarmm.o dlarrv.o dlartv.o \
344344
dlarz.o dlarzb.o dlarzt.o dlaswp.o dlasy2.o \
345345
dlasyf.o dlasyf_rook.o dlasyf_rk.o \
346346
dlatbs.o dlatdf.o dlatps.o dlatrd.o dlatrs.o dlatrz.o dlauu2.o \
@@ -376,7 +376,7 @@ DLASRC = \
376376
dtgsja.o dtgsna.o dtgsy2.o dtgsyl.o dtpcon.o dtprfs.o dtptri.o \
377377
dtptrs.o \
378378
dtrcon.o dtrevc.o dtrevc3.o dtrexc.o dtrrfs.o dtrsen.o dtrsna.o dtrsyl.o \
379-
dtrti2.o dtrtri.o dtrtrs.o dtzrzf.o dstemr.o \
379+
dtrsyl3.o dtrti2.o dtrtri.o dtrtrs.o dtzrzf.o dstemr.o \
380380
dsgesv.o dsposv.o dlag2s.o slag2d.o dlat2s.o \
381381
dlansf.o dpftrf.o dpftri.o dpftrs.o dsfrk.o dtfsm.o dtftri.o dtfttp.o \
382382
dtfttr.o dtpttf.o dtpttr.o dtrttf.o dtrttp.o \

SRC/dlarmm.f

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
*> \brief \b DLARMM
2+
*
3+
* Definition:
4+
* ===========
5+
*
6+
* DOUBLE PRECISION FUNCTION DLARMM( ANORM, BNORM, CNORM )
7+
*
8+
* .. Scalar Arguments ..
9+
* DOUBLE PRECISION ANORM, BNORM, CNORM
10+
* ..
11+
*
12+
*> \par Purpose:
13+
* =======
14+
*>
15+
*> \verbatim
16+
*>
17+
*> DLARMM returns a factor s in (0, 1] such that the linear updates
18+
*>
19+
*> (s * C) - A * (s * B) and (s * C) - (s * A) * B
20+
*>
21+
*> cannot overflow, where A, B, and C are matrices of conforming
22+
*> dimensions.
23+
*>
24+
*> This is an auxiliary routine so there is no argument checking.
25+
*> \endverbatim
26+
*
27+
* Arguments:
28+
* =========
29+
*
30+
*> \param[in] ANORM
31+
*> \verbatim
32+
*> ANORM is DOUBLE PRECISION
33+
*> The infinity norm of A. ANORM >= 0.
34+
*> The number of rows of the matrix A. M >= 0.
35+
*> \endverbatim
36+
*>
37+
*> \param[in] BNORM
38+
*> \verbatim
39+
*> BNORM is DOUBLE PRECISION
40+
*> The infinity norm of B. BNORM >= 0.
41+
*> \endverbatim
42+
*>
43+
*> \param[in] CNORM
44+
*> \verbatim
45+
*> CNORM is DOUBLE PRECISION
46+
*> The infinity norm of C. CNORM >= 0.
47+
*> \endverbatim
48+
*>
49+
*>
50+
* =====================================================================
51+
*> References:
52+
*> C. C. Kjelgaard Mikkelsen and L. Karlsson, Blocked Algorithms for
53+
*> Robust Solution of Triangular Linear Systems. In: International
54+
*> Conference on Parallel Processing and Applied Mathematics, pages
55+
*> 68--78. Springer, 2017.
56+
*>
57+
*> \ingroup OTHERauxiliary
58+
* =====================================================================
59+
60+
DOUBLE PRECISION FUNCTION DLARMM( ANORM, BNORM, CNORM )
61+
IMPLICIT NONE
62+
* .. Scalar Arguments ..
63+
DOUBLE PRECISION ANORM, BNORM, CNORM
64+
* .. Parameters ..
65+
DOUBLE PRECISION ONE, HALF, FOUR
66+
PARAMETER ( ONE = 1.0D0, HALF = 0.5D+0, FOUR = 4.0D0 )
67+
* ..
68+
* .. Local Scalars ..
69+
DOUBLE PRECISION BIGNUM, SMLNUM
70+
* ..
71+
* .. External Functions ..
72+
DOUBLE PRECISION DLAMCH
73+
EXTERNAL DLAMCH
74+
* ..
75+
* .. Executable Statements ..
76+
*
77+
*
78+
* Determine machine dependent parameters to control overflow.
79+
*
80+
SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
81+
BIGNUM = ( ONE / SMLNUM ) / FOUR
82+
*
83+
* Compute a scale factor.
84+
*
85+
DLARMM = ONE
86+
IF( BNORM .LE. ONE ) THEN
87+
IF( ANORM * BNORM .GT. BIGNUM - CNORM ) THEN
88+
DLARMM = HALF
89+
END IF
90+
ELSE
91+
IF( ANORM .GT. (BIGNUM - CNORM) / BNORM ) THEN
92+
DLARMM = HALF / BNORM
93+
END IF
94+
END IF
95+
RETURN
96+
*
97+
* ==== End of DLARMM ====
98+
*
99+
END

0 commit comments

Comments
 (0)