90 integer,
parameter :: wp = kind(1.e0)
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 crotg(a, b, c, s)
CROTG generates a Givens rotation with real cosine and complex sine.