LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ dlartg()

subroutine dlartg ( real(wp)  f,
real(wp)  g,
real(wp)  c,
real(wp)  s,
real(wp)  r 
)

DLARTG generates a plane rotation with real cosine and real sine.

Purpose:
 DLARTG generates a plane rotation so that

    [  C  S  ]  .  [ F ]  =  [ R ]
    [ -S  C  ]     [ G ]     [ 0 ]

 where C**2 + S**2 = 1.

 The mathematical formulas used for C and S are
    R = sign(F) * sqrt(F**2 + G**2)
    C = F / R
    S = G / R
 Hence C >= 0. The algorithm used to compute these quantities
 incorporates scaling to avoid overflow or underflow in computing the
 square root of the sum of squares.

 This version is discontinuous in R at F = 0 but it returns the same
 C and S as ZLARTG for complex inputs (F,0) and (G,0).

 This is a more accurate version of the BLAS1 routine DROTG,
 with the following other differences:
    F and G are unchanged on return.
    If G=0, then C=1 and S=0.
    If F=0 and (G .ne. 0), then C=0 and S=sign(1,G) without doing any
       floating point operations (saves work in DBDSQR when
       there are zeros on the diagonal).

 Below, wp=>dp stands for double precision from LA_CONSTANTS module.
Parameters
[in]F
          F is REAL(wp)
          The first component of vector to be rotated.
[in]G
          G is REAL(wp)
          The second component of vector to be rotated.
[out]C
          C is REAL(wp)
          The cosine of the rotation.
[out]S
          S is REAL(wp)
          The sine of the rotation.
[out]R
          R is REAL(wp)
          The nonzero component of the rotated vector.
Author
Edward Anderson, Lockheed Martin
Date
July 2016
Contributors:
Weslley Pereira, University of Colorado Denver, USA
Further Details:
  Anderson E. (2017)
  Algorithm 978: Safe Scaling in the Level 1 BLAS
  ACM Trans Math Softw 44:1--28
  https://doi.org/10.1145/3061665

Definition at line 110 of file dlartg.f90.

111 use la_constants, &
112 only: wp=>dp, zero=>dzero, half=>dhalf, one=>done, &
113 safmin=>dsafmin, safmax=>dsafmax
114!
115! -- LAPACK auxiliary routine --
116! -- LAPACK is a software package provided by Univ. of Tennessee, --
117! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
118! February 2021
119!
120! .. Scalar Arguments ..
121 real(wp) :: c, f, g, r, s
122! ..
123! .. Local Scalars ..
124 real(wp) :: d, f1, fs, g1, gs, u, rtmin, rtmax
125! ..
126! .. Intrinsic Functions ..
127 intrinsic :: abs, sign, sqrt
128! ..
129! .. Constants ..
130 rtmin = sqrt( safmin )
131 rtmax = sqrt( safmax/2 )
132! ..
133! .. Executable Statements ..
134!
135 f1 = abs( f )
136 g1 = abs( g )
137 if( g == zero ) then
138 c = one
139 s = zero
140 r = f
141 else if( f == zero ) then
142 c = zero
143 s = sign( one, g )
144 r = g1
145 else if( f1 > rtmin .and. f1 < rtmax .and. &
146 g1 > rtmin .and. g1 < rtmax ) then
147 d = sqrt( f*f + g*g )
148 c = f1 / d
149 r = sign( d, f )
150 s = g / r
151 else
152 u = min( safmax, max( safmin, f1, g1 ) )
153 fs = f / u
154 gs = g / u
155 d = sqrt( fs*fs + gs*gs )
156 c = abs( fs ) / d
157 r = sign( d, f )
158 s = gs / r
159 r = r*u
160 end if
161 return
real(dp), parameter dhalf
real(dp), parameter dzero
real(dp), parameter dsafmin
integer, parameter dp
real(dp), parameter done
real(dp), parameter dsafmax
LA_CONSTANTS is a module for the scaling constants for the compiled Fortran single and double precisi...
Here is the caller graph for this function: