File: pbstrad1.f

package info (click to toggle)
scalapack 1.6-13
  • links: PTS
  • area: main
  • in suites: potato
  • size: 30,476 kB
  • ctags: 25,789
  • sloc: fortran: 296,718; ansic: 51,265; makefile: 1,541; sh: 4
file content (140 lines) | stat: -rw-r--r-- 4,069 bytes parent folder | download
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
      SUBROUTINE PBSTRAD1( ICONTXT, UPLO, FORM, M, N, NZ, ALPHA, A, LDA,
     $                     BETA, B, LDB, MINT, NINT, MEN, NEN )
*
*  -- PB-BLAS routine (version 2.1) --
*     University of Tennessee, Knoxville, Oak Ridge National Laboratory.
*     April 28, 1996
*
*     .. Scalar Arguments ..
      CHARACTER          FORM, UPLO
      INTEGER            ICONTXT, LDA, LDB, M, MEN, MINT, N, NEN, NINT,
     $                   NZ
      REAL               ALPHA, BETA
*     ..
*     .. Array Arguments ..
      REAL               A( LDA, * ), B( LDB, * )
*     ..
*
*  Purpose
*  =======
*
*  PBSTRAD1 copies part of an upper (or lower) triangular matrix A
*  to another matrix B:
*                       B <== alpha * A + beta * B
*
*  =====================================================================
*
*     .. Local Scalars ..
      INTEGER            I, J, JP, JX, KZ, MM, MX
*     ..
*     .. External Functions ..
      LOGICAL            LSAME
      INTEGER            ICEIL
      EXTERNAL           ICEIL, LSAME
*     ..
*     .. External Subroutines ..
      EXTERNAL           PBSMATADD, PBSVECADD
*     ..
*     .. Intrinsic Functions ..
      INTRINSIC          MIN
*     ..
*     .. Executable Statements ..
*
      IF( LSAME( UPLO, 'U' ) ) THEN
*
         IF( LSAME( FORM, 'T' ) ) THEN
*
*           A is upper triangular (triangular part is at the bottom)
*
            MM = M
            JP = 0
            DO 10 J = 1, MIN( N-NZ, NEN-JP )
               JX = JP + J
               CALL PBSVECADD( ICONTXT, 'G', MM+J, ALPHA, A( 1, JX ), 1,
     $                         BETA, B( 1, JX ), 1 )
   10       CONTINUE
            MM = MM + MINT - NZ
            JP = JP + NINT - NZ
*
            DO 30 I = 2, ICEIL( NEN+NZ, NINT )
               DO 20 J = 1, MIN( N, NEN-JP )
                  JX = JP + J
                  CALL PBSVECADD( ICONTXT, 'G', MM+J, ALPHA, A( 1,JX ),
     $                            1, BETA, B( 1, JX ), 1 )
   20          CONTINUE
               MM = MM + MINT
               JP = JP + NINT
   30       CONTINUE
*
         ELSE
*
*           A is a rectangular matrix
*
            MM = M
            JP = 1
            KZ = NZ
            DO 40 I = 1, ICEIL( NEN+NZ, NINT )
               CALL PBSMATADD( ICONTXT, 'G', MM, MIN( N-KZ, NEN-JP+1 ),
     $                         ALPHA, A( 1, JP ), LDA, BETA, B( 1,JP ),
     $                         LDB )
               MM = MM + MINT
               JP = JP + NINT - KZ
               KZ = 0
   40       CONTINUE
*
         END IF
*
      ELSE
*
         IF( LSAME( FORM, 'T' ) ) THEN
*
*           A is lower triangular (triangular part is at the top)
*
            MM = M
            JP = 0
            DO 50 J = 1, MIN( N-NZ, NEN-JP )
               MX = MM + J
               JX = JP + J
               IF( MX.LE.MEN )
     $            CALL PBSVECADD( ICONTXT, 'G', MEN-MX+1, ALPHA,
     $                            A( MX, JX ), 1, BETA, B( MX, JX ), 1 )
   50       CONTINUE
            MM = MM + MINT - NZ
            JP = JP + NINT - NZ
*
            DO 70 I = 2, ICEIL( NEN+NZ, NINT )
               DO 60 J = 1, MIN( N, NEN-JP )
                  MX = MM + J
                  JX = JP + J
                  IF( MX.LE.MEN )
     $               CALL PBSVECADD( ICONTXT, 'G', MEN-MX+1, ALPHA,
     $                               A( MX, JX ), 1, BETA, B( MX, JX ),
     $                               1 )
   60          CONTINUE
               MM = MM + MINT
               JP = JP + NINT
   70       CONTINUE
*
         ELSE
*
*           A is a rectangular matrix
*
            MM = M + 1
            JP = 1
            KZ = NZ
            DO 80 I = 1, ICEIL( NEN+NZ, NINT )
               CALL PBSMATADD( ICONTXT, 'G', MEN-MM+1,
     $                         MIN(N-KZ, NEN-JP+1), ALPHA, A( MM, JP ),
     $                         LDA, BETA, B( MM, JP ), LDB )
               MM = MM + MINT
               JP = JP + NINT - KZ
               KZ = 0
   80       CONTINUE
         END IF
      END IF
*
      RETURN
*
*     End of PBSTRAD1
*
      END