1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
C/MEMBR ADD NAME=DROT,SSI=0
subroutine drot (n,dx,incx,dy,incy,c,s)
c
c!but
c
c etant donne deux vecteurs colonnes dx et dy, on applique
c la transformation plane:
c
c |c -s|
c |dx dy| = |dx dy|*| |
c |s c|
c
c dans le cas ou les increments sont negatifs cette
c subroutine prend les composantes en ordre inverse.
c
c!liste d'appel
c
c subroutine drot (n,dx,incx,dy,incy,c,s)
c
c n: entier, taille des vecteurs.
c
c dx, dy: vecteurs double precision.
c
c incx, incy: increments entre les elements des vecteurs.
c
c c, s: double precision. ils sont supposes etre cosinus et
c sinus, respectivement, du meme angle, mais on n'effectue
c pas de verification.
c
c!auteur
c
c jack dongarra, linpack, 3/11/78.
c
c!
c
double precision dx(*),dy(*),dtemp,c,s
integer i,incx,incy,ix,iy,n
c
if(n.le.0)return
if(incx.eq.1.and.incy.eq.1)go to 20
c
c code for unequal increments or equal increments not equal to 1
c
ix = 1
iy = 1
if(incx.lt.0)ix = (-n+1)*incx + 1
if(incy.lt.0)iy = (-n+1)*incy + 1
do 10 i = 1,n
dtemp = c*dx(ix) + s*dy(iy)
dy(iy) = c*dy(iy) - s*dx(ix)
dx(ix) = dtemp
ix = ix + incx
iy = iy + incy
10 continue
return
c
c code for both increments equal to 1
c
20 do 30 i = 1,n
dtemp = c*dx(i) + s*dy(i)
dy(i) = c*dy(i) - s*dx(i)
dx(i) = dtemp
30 continue
return
end
|