1       SUBROUTINE ZPFTRS( TRANSR, UPLO, N, NRHS, A, B, LDB, INFO )
  2 *
  3 *  -- LAPACK routine (version 3.3.1)                                    --
  4 *
  5 *  -- Contributed by Fred Gustavson of the IBM Watson Research Center --
  6 *  -- April 2011                                                      --
  7 *
  8 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  9 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 10 *
 11 *     .. Scalar Arguments ..
 12       CHARACTER          TRANSR, UPLO
 13       INTEGER            INFO, LDB, N, NRHS
 14 *     ..
 15 *     .. Array Arguments ..
 16       COMPLEX*16         A( 0* ), B( LDB, * )
 17 *     ..
 18 *
 19 *  Purpose
 20 *  =======
 21 *
 22 *  ZPFTRS solves a system of linear equations A*X = B with a Hermitian
 23 *  positive definite matrix A using the Cholesky factorization
 24 *  A = U**H*U or A = L*L**H computed by ZPFTRF.
 25 *
 26 *  Arguments
 27 *  =========
 28 *
 29 *  TRANSR    (input) CHARACTER*1
 30 *          = 'N':  The Normal TRANSR of RFP A is stored;
 31 *          = 'C':  The Conjugate-transpose TRANSR of RFP A is stored.
 32 *
 33 *  UPLO    (input) CHARACTER*1
 34 *          = 'U':  Upper triangle of RFP A is stored;
 35 *          = 'L':  Lower triangle of RFP A is stored.
 36 *
 37 *  N       (input) INTEGER
 38 *          The order of the matrix A.  N >= 0.
 39 *
 40 *  NRHS    (input) INTEGER
 41 *          The number of right hand sides, i.e., the number of columns
 42 *          of the matrix B.  NRHS >= 0.
 43 *
 44 *  A       (input) COMPLEX*16 array, dimension ( N*(N+1)/2 );
 45 *          The triangular factor U or L from the Cholesky factorization
 46 *          of RFP A = U**H*U or RFP A = L*L**H, as computed by ZPFTRF.
 47 *          See note below for more details about RFP A.
 48 *
 49 *  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
 50 *          On entry, the right hand side matrix B.
 51 *          On exit, the solution matrix X.
 52 *
 53 *  LDB     (input) INTEGER
 54 *          The leading dimension of the array B.  LDB >= max(1,N).
 55 *
 56 *  INFO    (output) INTEGER
 57 *          = 0:  successful exit
 58 *          < 0:  if INFO = -i, the i-th argument had an illegal value
 59 *
 60 *  Further Details
 61 *  ===============
 62 *
 63 *  We first consider Standard Packed Format when N is even.
 64 *  We give an example where N = 6.
 65 *
 66 *      AP is Upper             AP is Lower
 67 *
 68 *   00 01 02 03 04 05       00
 69 *      11 12 13 14 15       10 11
 70 *         22 23 24 25       20 21 22
 71 *            33 34 35       30 31 32 33
 72 *               44 45       40 41 42 43 44
 73 *                  55       50 51 52 53 54 55
 74 *
 75 *
 76 *  Let TRANSR = 'N'. RFP holds AP as follows:
 77 *  For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
 78 *  three columns of AP upper. The lower triangle A(4:6,0:2) consists of
 79 *  conjugate-transpose of the first three columns of AP upper.
 80 *  For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
 81 *  three columns of AP lower. The upper triangle A(0:2,0:2) consists of
 82 *  conjugate-transpose of the last three columns of AP lower.
 83 *  To denote conjugate we place -- above the element. This covers the
 84 *  case N even and TRANSR = 'N'.
 85 *
 86 *         RFP A                   RFP A
 87 *
 88 *                                -- -- --
 89 *        03 04 05                33 43 53
 90 *                                   -- --
 91 *        13 14 15                00 44 54
 92 *                                      --
 93 *        23 24 25                10 11 55
 94 *
 95 *        33 34 35                20 21 22
 96 *        --
 97 *        00 44 45                30 31 32
 98 *        -- --
 99 *        01 11 55                40 41 42
100 *        -- -- --
101 *        02 12 22                50 51 52
102 *
103 *  Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
104 *  transpose of RFP A above. One therefore gets:
105 *
106 *
107 *           RFP A                   RFP A
108 *
109 *     -- -- -- --                -- -- -- -- -- --
110 *     03 13 23 33 00 01 02    33 00 10 20 30 40 50
111 *     -- -- -- -- --                -- -- -- -- --
112 *     04 14 24 34 44 11 12    43 44 11 21 31 41 51
113 *     -- -- -- -- -- --                -- -- -- --
114 *     05 15 25 35 45 55 22    53 54 55 22 32 42 52
115 *
116 *
117 *  We next  consider Standard Packed Format when N is odd.
118 *  We give an example where N = 5.
119 *
120 *     AP is Upper                 AP is Lower
121 *
122 *   00 01 02 03 04              00
123 *      11 12 13 14              10 11
124 *         22 23 24              20 21 22
125 *            33 34              30 31 32 33
126 *               44              40 41 42 43 44
127 *
128 *
129 *  Let TRANSR = 'N'. RFP holds AP as follows:
130 *  For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
131 *  three columns of AP upper. The lower triangle A(3:4,0:1) consists of
132 *  conjugate-transpose of the first two   columns of AP upper.
133 *  For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
134 *  three columns of AP lower. The upper triangle A(0:1,1:2) consists of
135 *  conjugate-transpose of the last two   columns of AP lower.
136 *  To denote conjugate we place -- above the element. This covers the
137 *  case N odd  and TRANSR = 'N'.
138 *
139 *         RFP A                   RFP A
140 *
141 *                                   -- --
142 *        02 03 04                00 33 43
143 *                                      --
144 *        12 13 14                10 11 44
145 *
146 *        22 23 24                20 21 22
147 *        --
148 *        00 33 34                30 31 32
149 *        -- --
150 *        01 11 44                40 41 42
151 *
152 *  Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
153 *  transpose of RFP A above. One therefore gets:
154 *
155 *
156 *           RFP A                   RFP A
157 *
158 *     -- -- --                   -- -- -- -- -- --
159 *     02 12 22 00 01             00 10 20 30 40 50
160 *     -- -- -- --                   -- -- -- -- --
161 *     03 13 23 33 11             33 11 21 31 41 51
162 *     -- -- -- -- --                   -- -- -- --
163 *     04 14 24 34 44             43 44 22 32 42 52
164 *
165 *  =====================================================================
166 *
167 *     .. Parameters ..
168       COMPLEX*16         CONE
169       PARAMETER          ( CONE = ( 1.0D+00.0D+0 ) )
170 *     ..
171 *     .. Local Scalars ..
172       LOGICAL            LOWER, NORMALTRANSR
173 *     ..
174 *     .. External Functions ..
175       LOGICAL            LSAME
176       EXTERNAL           LSAME
177 *     ..
178 *     .. External Subroutines ..
179       EXTERNAL           XERBLA, ZTFSM
180 *     ..
181 *     .. Intrinsic Functions ..
182       INTRINSIC          MAX
183 *     ..
184 *     .. Executable Statements ..
185 *
186 *     Test the input parameters.
187 *
188       INFO = 0
189       NORMALTRANSR = LSAME( TRANSR, 'N' )
190       LOWER = LSAME( UPLO, 'L' )
191       IF.NOT.NORMALTRANSR .AND. .NOT.LSAME( TRANSR, 'C' ) ) THEN
192          INFO = -1
193       ELSE IF.NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN
194          INFO = -2
195       ELSE IF( N.LT.0 ) THEN
196          INFO = -3
197       ELSE IF( NRHS.LT.0 ) THEN
198          INFO = -4
199       ELSE IF( LDB.LT.MAX1, N ) ) THEN
200          INFO = -7
201       END IF
202       IF( INFO.NE.0 ) THEN
203          CALL XERBLA( 'ZPFTRS'-INFO )
204          RETURN
205       END IF
206 *
207 *     Quick return if possible
208 *
209       IF( N.EQ.0 .OR. NRHS.EQ.0 )
210      $   RETURN
211 *
212 *     start execution: there are two triangular solves
213 *
214       IF( LOWER ) THEN
215          CALL ZTFSM( TRANSR, 'L', UPLO, 'N''N', N, NRHS, CONE, A, B,
216      $               LDB )
217          CALL ZTFSM( TRANSR, 'L', UPLO, 'C''N', N, NRHS, CONE, A, B,
218      $               LDB )
219       ELSE
220          CALL ZTFSM( TRANSR, 'L', UPLO, 'C''N', N, NRHS, CONE, A, B,
221      $               LDB )
222          CALL ZTFSM( TRANSR, 'L', UPLO, 'N''N', N, NRHS, CONE, A, B,
223      $               LDB )
224       END IF
225 *
226       RETURN
227 *
228 *     End of ZPFTRS
229 *
230       END