File: sascal.f

package info (click to toggle)
scalapack 1.7.4-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 34,004 kB
  • ctags: 30,444
  • sloc: fortran: 310,201; ansic: 64,027; makefile: 1,838; sh: 4
file content (171 lines) | stat: -rw-r--r-- 4,093 bytes parent folder | download | duplicates (12)
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
      SUBROUTINE SASCAL( N, ALPHA, X, INCX )
*
*  -- PBLAS auxiliary routine (version 2.0) --
*     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
*     and University of California, Berkeley.
*     April 1, 1998
*
*     .. Scalar Arguments ..
      INTEGER            INCX, N
      REAL               ALPHA
*     ..
*     .. Array Arguments ..
      REAL               X( * )
*     ..
*
*  Purpose
*  =======
*
*  SASCAL performs the following operation:
*
*                   x := abs( alpha ) * abs( x ),
*
*  where alpha is a scalar and x is an n vector.
*
*  Arguments
*  =========
*
*  N       (input) INTEGER
*          On entry, N specifies the length of the vector x. N  must  be
*          at least zero.
*
*  ALPHA   (input) REAL
*          On entry, ALPHA specifies the scalar alpha.
*
*  X       (input/output) REAL array of dimension at least
*          ( 1 + ( n - 1 )*abs( INCX ) ). Before entry,  the incremented
*          array  X  must  contain the vector x. On exit, entries of the
*          incremented array X are mutiplied by alpha in absolute value.
*
*  INCX    (input) INTEGER
*          On entry, INCX specifies the increment for the elements of X.
*          INCX must not be zero.
*
*  -- Written on April 1, 1998 by
*     Antoine Petitet, University  of  Tennessee, Knoxville 37996, USA.
*
*  =====================================================================
*
*     .. Parameters ..
      REAL               ONE, ZERO
      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
*     ..
*     .. Local Scalars ..
      INTEGER            I, INFO, IX, M, MP1
*     ..
*     .. External Subroutines ..
      EXTERNAL           XERBLA
*     ..
*     .. Intrinsic Functions ..
      INTRINSIC          ABS, MOD
*     ..
*     .. Executable Statements ..
*
*     Test the input parameters.
*
      INFO = 0
      IF( N.LT.0 ) THEN
         INFO = 1
      ELSE IF( INCX.EQ.0 ) THEN
         INFO = 4
      END IF
      IF( INFO.NE.0 ) THEN
         CALL XERBLA( 'SASCAL', INFO )
         RETURN
      END IF
*
*     Quick return if possible.
*
      IF( N.LE.0 )
     $   RETURN
*
*     Form  x := abs( alpha ) * abs( x )
*
      IF( INCX.EQ.1 )
     $   GO TO 40
*
*     code for increments not equal to 1
*
*     Set up the start point in  X.
*
      IF( INCX.GT.0 ) THEN
         IX = 1
      ELSE
         IX = 1 - ( N - 1 ) * INCX
      END IF
*
      IF( ALPHA.EQ.ZERO ) THEN
         DO 10 I = 1, N
           X( IX ) = ZERO
           IX = IX + INCX
   10    CONTINUE
      ELSE IF( ALPHA.EQ.ONE ) THEN
         DO 20 I = 1, N
           X( IX ) = ABS( X( IX ) )
           IX = IX + INCX
   20    CONTINUE
      ELSE
         DO 30 I = 1, N
           X( IX ) = ABS( ALPHA * X( IX ) )
           IX = IX + INCX
   30    CONTINUE
      END IF
*
      RETURN
*
*     code for increment equal to 1
*
*     clean-up loop
*
   40 M = MOD( N, 4 )
*
      IF( M.EQ.0 )
     $   GO TO 80
*
      IF( ALPHA.EQ.ZERO ) THEN
         DO 50 I = 1, M
           X( I ) = ZERO
   50    CONTINUE
      ELSE IF( ALPHA.EQ.ONE ) THEN
         DO 60 I = 1, M
           X( I ) = ABS( X( I ) )
   60    CONTINUE
      ELSE
         DO 70 I = 1, M
           X( I ) = ABS( ALPHA * X( I ) )
   70    CONTINUE
      END IF
*
      IF( N.LT.4 )
     $   RETURN
*
   80 MP1 = M + 1
*
      IF( ALPHA.EQ.ZERO ) THEN
         DO 90 I = MP1, N, 4
            X( I     ) = ZERO
            X( I + 1 ) = ZERO
            X( I + 2 ) = ZERO
            X( I + 3 ) = ZERO
   90    CONTINUE
      ELSE IF( ALPHA.EQ.ONE ) THEN
         DO 100 I = MP1, N, 4
            X( I     ) = ABS( X( I     ) )
            X( I + 1 ) = ABS( X( I + 1 ) )
            X( I + 2 ) = ABS( X( I + 2 ) )
            X( I + 3 ) = ABS( X( I + 3 ) )
  100    CONTINUE
      ELSE
         DO 110 I = MP1, N, 4
            X( I     ) = ABS( ALPHA * X( I     ) )
            X( I + 1 ) = ABS( ALPHA * X( I + 1 ) )
            X( I + 2 ) = ABS( ALPHA * X( I + 2 ) )
            X( I + 3 ) = ABS( ALPHA * X( I + 3 ) )
  110    CONTINUE
      END IF
*
      RETURN
*
*     End of SASCAL
*
      END