dcopy(3f) - [M_odepack::matrix] copy a vector
subroutine dcopy(N,Dx,Incx,Dy,Incy)
integer,intent(in) :: N
real(kind=dp),intent(in) :: Dx(*)
integer,intent(in) :: Incx
real(kind=dp),intent(out) :: Dy(*)
integer,intent(in) :: Incy
Copy double precision DX to double precision DY. For I = 0 to N-1, copy DX(LX+IINCX) to DY(LY+IINCY), where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is defined in a similar way using INCY.
number of elements in input vector(s)
double precision vector with N elements
storage spacing between elements of DX
double precision vector with N elements
storage spacing between elements of DY
copy of vector DX (unchanged if N .LE. 0)
C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
Krogh, Basic linear algebra subprograms for Fortran
usage, Algorithm No. 539, Transactions on Mathematical
Software 5, 3 (September 1979), pp. 308-323.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | N | |||
real(kind=dp), | intent(in) | :: | Dx(*) | |||
integer, | intent(in) | :: | Incx | |||
real(kind=dp), | intent(out) | :: | Dy(*) | |||
integer, | intent(in) | :: | Incy |
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
integer, | public | :: | i | ||||
integer, | public | :: | ix | ||||
integer, | public | :: | iy | ||||
integer, | public | :: | m | ||||
integer, | public | :: | mp1 | ||||
integer, | public | :: | ns |
subroutine dcopy(N,Dx,Incx,Dy,Incy) ! integer , intent(in) :: N real(kind=dp) , intent(in) :: Dx(*) integer , intent(in) :: Incx real(kind=dp) , intent(out) :: Dy(*) integer , intent(in) :: Incy ! integer :: i , ix , iy , m , mp1 , ns ! if ( N<=0 ) return if ( Incx==Incy ) then if ( Incx<1 ) then elseif ( Incx==1 ) then ! ! Code for both increments equal to 1. ! ! Clean-up loop so remaining vector length is a multiple of 7. ! m = mod(N,7) if ( m/=0 ) then do i = 1 , m Dy(i) = Dx(i) enddo if ( N<7 ) return endif mp1 = m + 1 do i = mp1 , N , 7 Dy(i) = Dx(i) Dy(i+1) = Dx(i+1) Dy(i+2) = Dx(i+2) Dy(i+3) = Dx(i+3) Dy(i+4) = Dx(i+4) Dy(i+5) = Dx(i+5) Dy(i+6) = Dx(i+6) enddo return else ! ! Code for equal, positive, non-unit increments. ! ns = N*Incx do i = 1 , ns , Incx Dy(i) = Dx(i) enddo return endif endif ! ! Code for unequal or nonpositive increments. ! ix = 1 iy = 1 if ( Incx<0 ) ix = (-N+1)*Incx + 1 if ( Incy<0 ) iy = (-N+1)*Incy + 1 do i = 1 , N Dy(iy) = Dx(ix) ix = ix + Incx iy = iy + Incy enddo end subroutine dcopy