--- rpl/lapack/blas/drotmg.f 2012/12/14 14:22:02 1.11 +++ rpl/lapack/blas/drotmg.f 2023/08/07 08:38:43 1.17 @@ -2,21 +2,21 @@ * * =========== DOCUMENTATION =========== * -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ * * Definition: * =========== * * SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM) -* +* * .. Scalar Arguments .. * DOUBLE PRECISION DD1,DD2,DX1,DY1 * .. * .. Array Arguments .. * DOUBLE PRECISION DPARAM(5) * .. -* +* * *> \par Purpose: * ============= @@ -65,9 +65,9 @@ *> DY1 is DOUBLE PRECISION *> \endverbatim *> -*> \param[in,out] DPARAM +*> \param[out] DPARAM *> \verbatim -*> DPARAM is DOUBLE PRECISION array, dimension 5 +*> DPARAM is DOUBLE PRECISION array, dimension (5) *> DPARAM(1)=DFLAG *> DPARAM(2)=DH11 *> DPARAM(3)=DH21 @@ -78,22 +78,19 @@ * Authors: * ======== * -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. * *> \ingroup double_blas_level1 * * ===================================================================== SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM) * -* -- Reference BLAS level1 routine (version 3.4.0) -- +* -- Reference BLAS level1 routine -- * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 * * .. Scalar Arguments .. DOUBLE PRECISION DD1,DD2,DX1,DY1 @@ -135,7 +132,7 @@ DFLAG = -TWO DPARAM(1) = DFLAG RETURN - END IF + END IF * REGULAR-CASE.. DP1 = DD1*DX1 DQ2 = DP2*DY1 @@ -152,6 +149,19 @@ DD1 = DD1/DU DD2 = DD2/DU DX1 = DX1*DU + ELSE +* This code path if here for safety. We do not expect this +* condition to ever hold except in edge cases with rounding +* errors. See DOI: 10.1145/355841.355847 + DFLAG = -ONE + DH11 = ZERO + DH12 = ZERO + DH21 = ZERO + DH22 = ZERO +* + DD1 = ZERO + DD2 = ZERO + DX1 = ZERO END IF ELSE @@ -203,7 +213,7 @@ END IF ENDDO END IF - + IF (DD2.NE.ZERO) THEN DO WHILE ( (DABS(DD2).LE.RGAMSQ) .OR. (DABS(DD2).GE.GAMSQ) ) IF (DFLAG.EQ.ZERO) THEN @@ -223,10 +233,10 @@ DD2 = DD2/GAM**2 DH21 = DH21*GAM DH22 = DH22*GAM - END IF + END IF END DO END IF - + END IF IF (DFLAG.LT.ZERO) THEN @@ -236,7 +246,7 @@ DPARAM(5) = DH22 ELSE IF (DFLAG.EQ.ZERO) THEN DPARAM(3) = DH21 - DPARAM(4) = DH12 + DPARAM(4) = DH12 ELSE DPARAM(2) = DH11 DPARAM(5) = DH22 @@ -244,8 +254,7 @@ DPARAM(1) = DFLAG RETURN +* +* End of DROTMG +* END - - - -