![]() |
LAPACK
3.4.1
LAPACK: Linear Algebra PACKage
|
00001 *> \brief \b DROTM 00002 * 00003 * =========== DOCUMENTATION =========== 00004 * 00005 * Online html documentation available at 00006 * http://www.netlib.org/lapack/explore-html/ 00007 * 00008 * Definition: 00009 * =========== 00010 * 00011 * SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM) 00012 * 00013 * .. Scalar Arguments .. 00014 * INTEGER INCX,INCY,N 00015 * .. 00016 * .. Array Arguments .. 00017 * DOUBLE PRECISION DPARAM(5),DX(*),DY(*) 00018 * .. 00019 * 00020 * 00021 *> \par Purpose: 00022 * ============= 00023 *> 00024 *> \verbatim 00025 *> 00026 *> APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX 00027 *> 00028 *> (DX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF DX ARE IN 00029 *> (DY**T) 00030 *> 00031 *> DX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE 00032 *> LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY. 00033 *> WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS.. 00034 *> 00035 *> DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0 00036 *> 00037 *> (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0) 00038 *> H=( ) ( ) ( ) ( ) 00039 *> (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0). 00040 *> SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM. 00041 *> \endverbatim 00042 * 00043 * Arguments: 00044 * ========== 00045 * 00046 *> \param[in] N 00047 *> \verbatim 00048 *> N is INTEGER 00049 *> number of elements in input vector(s) 00050 *> \endverbatim 00051 *> 00052 *> \param[in,out] DX 00053 *> \verbatim 00054 *> DX is DOUBLE PRECISION array, dimension N 00055 *> double precision vector with N elements 00056 *> \endverbatim 00057 *> 00058 *> \param[in] INCX 00059 *> \verbatim 00060 *> INCX is INTEGER 00061 *> storage spacing between elements of DX 00062 *> \endverbatim 00063 *> 00064 *> \param[in,out] DY 00065 *> \verbatim 00066 *> DY is DOUBLE PRECISION array, dimension N 00067 *> double precision vector with N elements 00068 *> \endverbatim 00069 *> 00070 *> \param[in] INCY 00071 *> \verbatim 00072 *> INCY is INTEGER 00073 *> storage spacing between elements of DY 00074 *> \endverbatim 00075 *> 00076 *> \param[in,out] DPARAM 00077 *> \verbatim 00078 *> DPARAM is DOUBLE PRECISION array, dimension 5 00079 *> DPARAM(1)=DFLAG 00080 *> DPARAM(2)=DH11 00081 *> DPARAM(3)=DH21 00082 *> DPARAM(4)=DH12 00083 *> DPARAM(5)=DH22 00084 *> \endverbatim 00085 * 00086 * Authors: 00087 * ======== 00088 * 00089 *> \author Univ. of Tennessee 00090 *> \author Univ. of California Berkeley 00091 *> \author Univ. of Colorado Denver 00092 *> \author NAG Ltd. 00093 * 00094 *> \date November 2011 00095 * 00096 *> \ingroup double_blas_level1 00097 * 00098 * ===================================================================== 00099 SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM) 00100 * 00101 * -- Reference BLAS level1 routine (version 3.4.0) -- 00102 * -- Reference BLAS is a software package provided by Univ. of Tennessee, -- 00103 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00104 * November 2011 00105 * 00106 * .. Scalar Arguments .. 00107 INTEGER INCX,INCY,N 00108 * .. 00109 * .. Array Arguments .. 00110 DOUBLE PRECISION DPARAM(5),DX(*),DY(*) 00111 * .. 00112 * 00113 * ===================================================================== 00114 * 00115 * .. Local Scalars .. 00116 DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,TWO,W,Z,ZERO 00117 INTEGER I,KX,KY,NSTEPS 00118 * .. 00119 * .. Data statements .. 00120 DATA ZERO,TWO/0.D0,2.D0/ 00121 * .. 00122 * 00123 DFLAG = DPARAM(1) 00124 IF (N.LE.0 .OR. (DFLAG+TWO.EQ.ZERO)) RETURN 00125 IF (INCX.EQ.INCY.AND.INCX.GT.0) THEN 00126 * 00127 NSTEPS = N*INCX 00128 IF (DFLAG.LT.ZERO) THEN 00129 DH11 = DPARAM(2) 00130 DH12 = DPARAM(4) 00131 DH21 = DPARAM(3) 00132 DH22 = DPARAM(5) 00133 DO I = 1,NSTEPS,INCX 00134 W = DX(I) 00135 Z = DY(I) 00136 DX(I) = W*DH11 + Z*DH12 00137 DY(I) = W*DH21 + Z*DH22 00138 END DO 00139 ELSE IF (DFLAG.EQ.ZERO) THEN 00140 DH12 = DPARAM(4) 00141 DH21 = DPARAM(3) 00142 DO I = 1,NSTEPS,INCX 00143 W = DX(I) 00144 Z = DY(I) 00145 DX(I) = W + Z*DH12 00146 DY(I) = W*DH21 + Z 00147 END DO 00148 ELSE 00149 DH11 = DPARAM(2) 00150 DH22 = DPARAM(5) 00151 DO I = 1,NSTEPS,INCX 00152 W = DX(I) 00153 Z = DY(I) 00154 DX(I) = W*DH11 + Z 00155 DY(I) = -W + DH22*Z 00156 END DO 00157 END IF 00158 ELSE 00159 KX = 1 00160 KY = 1 00161 IF (INCX.LT.0) KX = 1 + (1-N)*INCX 00162 IF (INCY.LT.0) KY = 1 + (1-N)*INCY 00163 * 00164 IF (DFLAG.LT.ZERO) THEN 00165 DH11 = DPARAM(2) 00166 DH12 = DPARAM(4) 00167 DH21 = DPARAM(3) 00168 DH22 = DPARAM(5) 00169 DO I = 1,N 00170 W = DX(KX) 00171 Z = DY(KY) 00172 DX(KX) = W*DH11 + Z*DH12 00173 DY(KY) = W*DH21 + Z*DH22 00174 KX = KX + INCX 00175 KY = KY + INCY 00176 END DO 00177 ELSE IF (DFLAG.EQ.ZERO) THEN 00178 DH12 = DPARAM(4) 00179 DH21 = DPARAM(3) 00180 DO I = 1,N 00181 W = DX(KX) 00182 Z = DY(KY) 00183 DX(KX) = W + Z*DH12 00184 DY(KY) = W*DH21 + Z 00185 KX = KX + INCX 00186 KY = KY + INCY 00187 END DO 00188 ELSE 00189 DH11 = DPARAM(2) 00190 DH22 = DPARAM(5) 00191 DO I = 1,N 00192 W = DX(KX) 00193 Z = DY(KY) 00194 DX(KX) = W*DH11 + Z 00195 DY(KY) = -W + DH22*Z 00196 KX = KX + INCX 00197 KY = KY + INCY 00198 END DO 00199 END IF 00200 END IF 00201 RETURN 00202 END