89 subroutine zrotg( a, b, c, s )
90 integer,
parameter :: wp = kind(1.d0)
97 real(wp),
parameter :: zero = 0.0_wp
98 real(wp),
parameter :: one = 1.0_wp
99 complex(wp),
parameter :: czero = 0.0_wp
102 real(wp),
parameter :: safmin = real(radix(0._wp),wp)**max( &
103 minexponent(0._wp)-1, &
104 1-maxexponent(0._wp) &
106 real(wp),
parameter :: safmax = real(radix(0._wp),wp)**max( &
107 1-minexponent(0._wp), &
108 maxexponent(0._wp)-1 &
110 real(wp),
parameter :: rtmin = sqrt( safmin )
114 complex(wp) :: a, b, s
117 real(wp) :: d, f1, f2, g1, g2, h2, u, v, w, rtmax
118 complex(wp) :: f, fs, g, gs, r, t
121 intrinsic :: abs, aimag, conjg, max, min,
real, sqrt
127 abssq( t ) =
real( t )**2 + aimag( t )**2
133 if( g == czero )
then 137 else if( f == czero )
then 139 if(
real(g) == zero )
then 142 elseif( aimag(g) == zero )
then 146 g1 = max( abs(
real(g)), abs(aimag(g)) )
147 rtmax = sqrt( safmax/2 )
148 if( g1 > rtmin .and. g1 < rtmax )
then 162 u = min( safmax, max( safmin, g1 ) )
173 f1 = max( abs(
real(f)), abs(aimag(f)) )
174 g1 = max( abs(
real(g)), abs(aimag(g)) )
175 rtmax = sqrt( safmax/4 )
176 if( f1 > rtmin .and. f1 < rtmax .and. &
177 g1 > rtmin .and. g1 < rtmax )
then 185 if( f2 >= h2 * safmin )
then 190 if( f2 > rtmin .and. h2 < rtmax )
then 192 s = conjg( g ) * ( f / sqrt( f2*h2 ) )
194 s = conjg( g ) * ( r / h2 )
205 if( c >= safmin )
then 212 s = conjg( g ) * ( f / d )
218 u = min( safmax, max( safmin, f1, g1 ) )
221 if( f1 / u < rtmin )
then 226 v = min( safmax, max( safmin, f1 ) )
241 if( f2 >= h2 * safmin )
then 246 if( f2 > rtmin .and. h2 < rtmax )
then 248 s = conjg( gs ) * ( fs / sqrt( f2*h2 ) )
250 s = conjg( gs ) * ( r / h2 )
261 if( c >= safmin )
then 268 s = conjg( gs ) * ( fs / d )
subroutine zrotg(a, b, c, s)
ZROTG generates a Givens rotation with real cosine and complex sine.