File: dlaswap.f90

package info (click to toggle)
lfortran 0.60.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,416 kB
  • sloc: cpp: 173,406; f90: 80,491; python: 17,586; ansic: 9,610; yacc: 2,356; sh: 1,401; fortran: 895; makefile: 38; javascript: 15
file content (94 lines) | stat: -rw-r--r-- 2,371 bytes parent folder | download | duplicates (2)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
subroutine dlaswp(n, a, lda, k1, k2, ipiv, incx)
      INTEGER            INCX, K1, K2, LDA, N
      INTEGER            IPIV( * )
      DOUBLE PRECISION   A( LDA, * )
      INTEGER            I, I1, I2, INC, IP, IX, IX0, J, K, N32
      DOUBLE PRECISION   TEMP
      IF( incx > 0 ) THEN
         ix0 = k1
         i1 = k1
         i2 = k2
         inc = 1
      ELSE IF( incx < 0 ) THEN
         ix0 = k1 + ( k1-k2 )*incx
         i1 = k2
         i2 = k1
         inc = -1
      ELSE
         RETURN
      END IF
      n32 = ( n / 32 )*32
      IF( n32 /= 0 ) THEN
         DO 30 j = 1, n32, 32
            ix = ix0
            DO 20 i = i1, i2, inc
               ip = ipiv( ix )
               IF( ip /= i ) THEN
                  DO 10 k = j, j + 31
                     temp = a( i, k )
                     a( i, k ) = a( ip, k )
                     a( ip, k ) = temp
   10             CONTINUE
               END IF
               ix = ix + incx
   20       CONTINUE
   30    CONTINUE
      END IF
      IF( n32 /= n ) THEN
         n32 = n32 + 1
         ix = ix0
         DO 50 i = i1, i2, inc
            ip = ipiv( ix )
            IF( ip /= i ) THEN
               DO 40 k = n32, n
                  temp = a( i, k )
                  a( i, k ) = a( ip, k )
                  a( ip, k ) = temp
   40          CONTINUE
            END IF
            ix = ix + incx
   50    CONTINUE
      END IF
   RETURN
end subroutine

PROGRAM test_dlaswp
   INTEGER :: n, lda, k1, k2, incx, i
   INTEGER, ALLOCATABLE :: ipiv(:)
   DOUBLE PRECISION, ALLOCATABLE :: a(:,:)

   ! Define the input values
   n = 4
   lda = 4
   k1 = 1
   k2 = 4
   incx = 1

   ! Allocate the arrays
   ALLOCATE(ipiv(n))
   ALLOCATE(a(lda, n))

    ! Initialize the matrix 'a' in column-major order
    a = RESHAPE([ 1.0D0, 2.0D0, 3.0D0, 4.0D0, &
                 5.0D0, 6.0D0, 7.0D0, 8.0D0, &
                 9.0D0, 10.0D0, 11.0D0, 12.0D0, &
                 13.0D0, 14.0D0, 15.0D0, 16.0D0 ], [ lda, n ])

    ! Initialize the pivot array
    ipiv = [4, 1, 2, 3]

   ! Print the original matrix
   PRINT *, "Original matrix A:"
   DO i = 1, lda
       PRINT *, a(i, :)
   END DO

   ! Call the subroutine
   CALL dlaswp(n, a, lda, k1, k2, ipiv, incx)

   ! Print the modified matrix
   PRINT *, "Modified matrix A:"
   DO i = 1, lda
       PRINT *, a(i, :)
   END DO
END PROGRAM test_dlaswp